function ListNode(val) {
    this.name = val;
    this.next = null;
}

var a = new ListNode(1);
var b = new ListNode(2);
var c = new ListNode(3);
a.next = b;
b.next = c;

let head = a;
while (head) {
    console.log("转换前：：：", head.name);
    head = head.next
}

function reverseList(head, left, right) {
    // let dummy = new ListNode(0);
    // dummy.next = head; // 拼接一个头

    // let temHead = dummy; // 中转变量
    // 
    // // -1 是因为补了一个头 
    // for (let i = 0; i < m - 1; i++) {
    //     temHead = temHead.next; // 这里是获取反转的前一个
    // }

    // var pre = null;
    // var curr = temHead.next; // 这里获取的才是第一个m位节点
    // for (let j = 0; j < n - m; j++) {
    //     var next = curr.next; // 目标的下一个 // next 是 3
    //     curr.next = pre;  // 3(指针)-> null
    //     pre = curr;  // pre = 2
    //     curr = next; // curr = 3

    // }

    // temHead.next.next = curr; // 2(指针) -> 3
    // temHead.next = curr; // 1（指针）-> 2

    // return dummy.next;

    // 1
    const dummy_node = new ListNode(0);
    dummy_node.next = head;

    // 2
    let pre = dummy_node;
    // 0 | 1(0) 2(1) 3（2）
    for (let i = 0; i < left - 1; ++i) {
        pre = pre.next;  // pre 是目标前一个
    }
    //  3
    // curr：指向待反转区域的第一个节点 left；
    // next：永远指向 curr 的下一个节点，循环过程中，curr 变化以后 next 会变化；
    // pre：永远指向待反转区域的第一个节点 left 的前一个节点，在循环过程中不变。
    // https://pic.leetcode-cn.com/1615105296-bmiPxl-image.png
    let cur = pre.next; // cur 是当前
    for (let i = 0; i < right - left; ++i) {
        const next = cur.next; // 目标下一个 // next 是2    // 
        cur.next = next.next;  // 1（指针）-> 3
        next.next = pre.next;  // 2 (指针) -> 1
        pre.next = next;  // 0(指针) -> 2 
    }
    return dummy_node.next;
}

head = reverseList(a, 0, 1)
while (head) {
    console.log("转化后：：：", head.name);
    head = head.next
}